#Starting from saved object

library(Seurat)
library(ggplot2)
library(Matrix)
library(dplyr)


markCluster <- function(fex){
  FeaturePlot(langer, features = fex, cols = c("grey", "red"), reduction = "tsne", combine = F, label = T)
  VlnPlot(langer, features = fex, split.by = "seurat_clusters", pt.size = 0, combine = F)
}

langer <- readRDS('/home/vqf/proyectos/TFGs/Ruben/NoteBooks/langer.rds')
DimPlot(langer, reduction = 'tsne', split.by =  'genotype', label = T, repel = T)

Get characteristic genes for each cluster. The tutorial advises using the original data.

TSNEPlot(langer)

Lmna expression

FeaturePlot(langer, features = c("Lmna"), cols = c("grey", "red"), reduction = "tsne", combine = F, label = T)
[[1]]

VlnPlot(langer, features = c("Lmna"), split.by = "seurat_clusters", pt.size = 0)

VlnPlot(langer, features = c("Lmna"), split.by = "genotype", pt.size = 0)

Calr expression

FeaturePlot(langer, features = c("Calr"), cols = c("grey", "red"), reduction = "tsne", combine = F, label = T)
[[1]]

VlnPlot(langer, features = c("Calr"), split.by = "seurat_clusters", pt.size = 0)

VlnPlot(langer, features = c("Calr"), split.by = "genotype", pt.size = 0)

Hspa5 expression

FeaturePlot(langer, features = c("Hspa5"), cols = c("grey", "red"), reduction = "tsne", combine = F, label = T)
[[1]]

VlnPlot(langer, features = c("Hspa5"), split.by = "seurat_clusters", pt.size = 0)

VlnPlot(langer, features = c("Hspa5"), split.by = "genotype", pt.size = 0)

Ins expression

fex <- c("Ins1", "Ins2", "Gcg", "Ppy", "Sst", "Rbp4", "Mafb", "Mafa", "Ghrl" , "Zfp608", "Irx2", "Nr4a2")
DotPlot(langer, features = c("Gcg", "Ins1", "Sst", "Ppy"), group.by = "seurat_clusters")

markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

[[11]]

[[12]]

Proliferating

fex <- c("Gmnn", "Mki67", "Pcna")
markCluster(fex)
[[1]]

[[2]]

[[3]]

Dying

fex <- c("Casp3", "Bcl2", "Parp1", "Nfkb1")
markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

Exocrine

fex <- c("Amy2a1", "Cela3a", "Cpa1")
markCluster(fex)
[[1]]

Endocrine

fex <- c("Chga", "Chgb", "Pcsk1","Pcsk2", "Scg2", "Scg5", "Neurod1", "Isl1", "Pax6")
markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

Fibroblast

fex <- c("Col3a1", "Fbn1", "Lum")
markCluster(fex)
[[1]]

[[2]]

[[3]]

Smooth-muscle cells

fex <- c("Acta2", "Actg2", "Myh11")
markCluster(fex)
[[1]]

[[2]]

[[3]]

SMC and Fibroblast tend to be in mixed clusters so we can select more acurrate threshold

RidgePlot(subset(langer, seurat_clusters==9), features = c("Acta2"))+ geom_vline(xintercept=0.5)

RidgePlot(subset(langer, seurat_clusters==9), features = c("Lum"))+ geom_vline(xintercept=0.37)

FeatureScatter(subset(langer, seurat_clusters==9), "Acta2", "Lum", span = T)+ geom_vline(xintercept=0.5)+ geom_hline(yintercept=0.37)

RidgePlot(subset(langer, seurat_clusters==9), features = c("Acta2"))+ geom_vline(xintercept=0.7)

RidgePlot(subset(langer, seurat_clusters==9), features = c("Col3a1"))+ geom_vline(xintercept=0.45)

FeatureScatter(subset(langer, seurat_clusters==9), "Acta2", "Col3a1", span = T)+ geom_vline(xintercept=0.5)+ geom_hline(yintercept=0.7)

Endothelial cells

fex <- c("Cd34", "Pecam1", "Sele", "Slc2a1", "Vwf")
markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

Leukocytes

fex <- c("Ptprc")
markCluster(fex)
[[1]]

B cells

fex <- c("Cd19", "Cr2", "Ms4a1")
markCluster(fex)
[[1]]

[[2]]

[[3]]

T cells

fex <- c("Cd3e", "Cd4", "Cd8a", "Foxp3", "L17a", "Gzmb", "Tox", "Pdcd1", "Slamf6")
markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

Plasma cells

fex <- c("Pim2")
markCluster(fex)
[[1]]

Dendritic cells

fex <- c("Gzmb", "Il3ra")
markCluster(fex)
[[1]]

[[2]]

Schwann cells

fex <- c("Mbp", "Mpz", "S100b", "Sox10")
markCluster(fex)
[[1]]

[[2]]

Monocytes

fex <- c("Fcgr4")
markCluster(fex)
[[1]]

NK cells

fex <- c("Cd27")
markCluster(fex)
[[1]]

Macrophages

fex <- c("Ccr5", "Cd68", "Marco", "Mrc1", "Msr1")
markCluster(fex)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

Ductal

fex <- c("Krt17")
markCluster(fex)
[[1]]

Beta and delta cells

fex <- c("Ins1", "Sst")
markCluster(fex)
[[1]]

[[2]]

We select ours clusters with Beta and Delta cells

RidgePlot(subset(langer, seurat_clusters==20), features = c("Ins1"))+ geom_vline(xintercept=5.5)

RidgePlot(subset(langer, seurat_clusters==20), features = c("Sst"))+ geom_vline(xintercept=4)

FeatureScatter(subset(langer, seurat_clusters==20), "Ins1", "Sst", span = T)+ geom_vline(xintercept=5.5)+ geom_hline(yintercept=4)

Alpha and PP

fex <- c("Gcg", "Ppy")
markCluster(fex)
[[1]]

[[2]]

We select our cluster with Alpha and PP cells

RidgePlot(subset(langer, seurat_clusters==23), features = c("Gcg"))+ geom_vline(xintercept=5.5)

RidgePlot(subset(langer, seurat_clusters==23), features = c("Ppy"))+ geom_vline(xintercept=2.5)

FeatureScatter(subset(langer, seurat_clusters==23), "Gcg", "Ppy", span = T)+ geom_vline(xintercept=5.5)+ geom_hline(yintercept=2.5)

FeatureScatter(subset(langer, seurat_clusters==23), "Gcg", "Sst", span = T)+ geom_vline(xintercept=5.5)+ geom_hline(yintercept=2.7)

##Clasification

Identify cell types

  d <- GetAssayData(langer)
  m <- matrix(data=c("Other"),nrow=ncol(d),ncol=1,byrow = F,dimnames = list(colnames(d),c("celltype")))
  setClusterName <- function(seuratObj, mobj, clusters, clusterName){
    ind <- seuratObj@meta.data[seuratObj@meta.data$seurat_clusters %in% clusters,]
    mobj[rownames(ind), "celltype"] <- c(clusterName)
    return(mobj)
  }

Umbrales

# NK cells
ind <- subset(langer, subset = Cd27 > 0.2 )
m[rownames(ind@meta.data), "celltype"] <- "NK cell"

# Plasma cells
ind <- subset(langer, subset = Pim2 > 0.2 )
m[rownames(ind@meta.data), "celltype"] <- "Plasma cell"

# Macrophages
ind <- subset(langer, subset = Cd68 > 0.3  | Marco > 0.3| Mrc1 > 0.3 | Msr1 > 0.3 )
m[rownames(ind@meta.data), "celltype"] <- "Macrophage"

# Smooth muscle cells
ind <- subset(langer, subset = (Acta2 > 0.5 & Lum > 0.37) | (Acta2 > 0.7 & Col3a1 > 0.45))
m[rownames(ind@meta.data), "celltype"] <- "SMC"

# Fibroblasts
ind <- subset(langer, subset = (Acta2 < 0.5 & Lum < 0.37) | (Acta2 < 0.7 & Col3a1 < 0.45))
m[rownames(ind@meta.data), "celltype"] <- "Fibroblast"

# Leukocytes
ind <- subset(langer, subset = Ptprc > 1)
m[rownames(ind@meta.data), "celltype"] <- "Leukocyte"

# T cells
ind <- subset(langer, subset = Cd3e > 0.3 | Foxp3 > 0.3 | Cd8a > 0.3 | Cd4 > 0.3 )
m[rownames(ind@meta.data), "celltype"] <- "T cell"

# B cells
ind <- subset(langer, subset = Ms4a1 > 0.3 | Cd19 > 0.3)
m[rownames(ind@meta.data), "celltype"] <- "B cell"

# Endothelial cells
ind <- subset(langer, subset = Cd34 > 0.3 | Slc2a1 > 0.3 | Pecam1 > 0.3)
m[rownames(ind@meta.data), "celltype"] <- "Endothelial"

# Beta cells
ind <- subset(langer, subset = (Ins1 > 5.5 & Gcg < 2 & Ppy < 2))
m[rownames(ind@meta.data), "celltype"] <- "Beta"

# Alpha cells
ind <- subset(langer, subset = (Gcg > 5.5 & Ppy < 2.5 & Ins1 < 5.5))
m[rownames(ind@meta.data), "celltype"] <- "Alpha"

# Delta cells
ind <- subset(langer, subset = (Sst > 4 & Ins1 < 5.5 & Gcg < 2))
m[rownames(ind@meta.data), "celltype"] <- "Delta"

# PP cells
ind <- subset(langer, subset = (Ppy > 2.5 & Gcg < 5.5 & Ins1 < 2))
m[rownames(ind@meta.data), "celltype"] <- "PP"

# BD cells
ind <- subset(langer, subset = (Ins1 > 5.5 & Sst > 4 & Ppy < 2))
m[rownames(ind@meta.data), "celltype"] <- "BD"
  
# AP cells
ind <- subset(langer, subset = (Gcg > 4 & Ppy > 2 & Ins1 < 1.5 & Sst < 1.5))
m[rownames(ind@meta.data), "celltype"] <- "AP"
  
langer <- AddMetaData(langer, m, col.name = "celltype")
Idents(langer) <- 'celltype'
TSNEPlot(langer, label=T, split.by = 'genotype')

Save islets cells.

langer$celltype <- m[rownames(langer@meta.data), "celltype"]
islets <- subset(langer, celltype=='Alpha' | celltype=='Beta' | celltype=='Delta' | celltype=="DB" | celltype=="BD" | celltype== "AP"| celltype== "PP" | celltype== "PA")
saveRDS(islets, file = '/home/vqf/proyectos/TFGs/Ruben/NoteBooks/islets.rds')

Interpretate Data

table(langer@meta.data$genotype)

   KO    WT 
31588 26893 
tbl_wt <- table(langer@meta.data$celltype[langer@meta.data$genotype == "WT"])
cbind(tbl_wt,round(prop.table(tbl_wt)*100,2))
            tbl_wt      
Alpha           64  0.24
AP              26  0.10
B cell        3692 13.73
BD               2  0.01
Beta            68  0.25
Delta           15  0.06
Endothelial   4373 16.26
Fibroblast    5455 20.28
Leukocyte     1377  5.12
Macrophage       2  0.01
NK cell          1  0.00
Other          224  0.83
PP              45  0.17
SMC            101  0.38
T cell       11448 42.57
tbl_ko <- table(langer@meta.data$celltype[langer@meta.data$genotype == "KO"])
cbind(tbl_ko,round(prop.table(tbl_ko)*100,2))
            tbl_ko      
Alpha          215  0.68
AP             144  0.46
B cell        3384 10.71
BD               2  0.01
Beta           266  0.84
Delta           36  0.11
Endothelial   5084 16.09
Fibroblast    6037 19.11
Leukocyte     1356  4.29
Macrophage       4  0.01
Other          409  1.29
Plasma cell      2  0.01
PP             164  0.52
SMC            293  0.93
T cell       14192 44.93
tbl <- table(islets@meta.data$celltype, islets@meta.data$orig.ident)
cbind(tbl,round(prop.table(tbl)*100,2))
      158WT 161KO 235KO 238WT 243KO 244WT 158WT 161KO 235KO 238WT 243KO 244WT
Alpha    33    64    94    26    57     5  3.15  6.11  8.98  2.48  5.44  0.48
AP       10    35    82    12    27     4  0.96  3.34  7.83  1.15  2.58  0.38
BD        1     0     1     1     1     0  0.10  0.00  0.10  0.10  0.10  0.00
Beta     18    53   113    22   100    28  1.72  5.06 10.79  2.10  9.55  2.67
Delta    10    16     9     5    11     0  0.96  1.53  0.86  0.48  1.05  0.00
PP       27    59    67    15    38     3  2.58  5.64  6.40  1.43  3.63  0.29
RidgePlot(subset(langer, seurat_clusters==20), features = c("Ins1"))+ geom_vline(xintercept=5.5)

RidgePlot(subset(langer, seurat_clusters==20), features = c("Sst"))+ geom_vline(xintercept=4)

Inmuno <- subset(langer, celltype== 'Macrophage' | celltype== 'Leukocyte' | celltype== 'B cell' | celltype== 'T cell'| celltype== 'NK cell')
DimPlot(islets, reduction = "tsne", split.by = "genotype", group.by = "celltype", label = TRUE, pt.size = 1.4) + ggtitle("Distribución de células inmunes (tSNE)")

DimPlot(langer, reduction = "tsne", group.by = "celltype", label = TRUE, pt.size = 1.2) +
  ggtitle("Distribución de tipos celulares (tSNE)")

# DimPlot sólo con células endocrinas
p <-DimPlot(islets, reduction = "tsne", split.by = "genotype", group.by = "celltype", label = TRUE, pt.size = 1.4) +
  ggtitle("Distribución de células endocrinas (tSNE)")
p + xlim (20, 30) + ylim(15, 35)

LS0tCnRpdGxlOiAiTGFuZ2VyaGFucyBBVVRPIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgojU3RhcnRpbmcgZnJvbSBzYXZlZCBvYmplY3QKCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KE1hdHJpeCkKbGlicmFyeShkcGx5cikKCgptYXJrQ2x1c3RlciA8LSBmdW5jdGlvbihmZXgpewogIEZlYXR1cmVQbG90KGxhbmdlciwgZmVhdHVyZXMgPSBmZXgsIGNvbHMgPSBjKCJncmV5IiwgInJlZCIpLCByZWR1Y3Rpb24gPSAidHNuZSIsIGNvbWJpbmUgPSBGLCBsYWJlbCA9IFQpCiAgVmxuUGxvdChsYW5nZXIsIGZlYXR1cmVzID0gZmV4LCBzcGxpdC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBwdC5zaXplID0gMCwgY29tYmluZSA9IEYpCn0KCmxhbmdlciA8LSByZWFkUkRTKCcvaG9tZS92cWYvcHJveWVjdG9zL1RGR3MvUnViZW4vTm90ZUJvb2tzL2xhbmdlci5yZHMnKQpEaW1QbG90KGxhbmdlciwgcmVkdWN0aW9uID0gJ3RzbmUnLCBzcGxpdC5ieSA9ICAnZ2Vub3R5cGUnLCBsYWJlbCA9IFQsIHJlcGVsID0gVCkKYGBgCgpHZXQgY2hhcmFjdGVyaXN0aWMgZ2VuZXMgZm9yIGVhY2ggY2x1c3Rlci4gVGhlIFt0dXRvcmlhbF0oaHR0cHM6Ly9zYXRpamFsYWIub3JnL3NldXJhdC9hcnRpY2xlcy9pbnRlZ3JhdGlvbl9pbnRyb2R1Y3Rpb24uaHRtbCkgYWR2aXNlcyB1c2luZyB0aGUgb3JpZ2luYWwgZGF0YS4KCgpgYGB7cn0KVFNORVBsb3QobGFuZ2VyKQpgYGAKCiMgTG1uYSBleHByZXNzaW9uCgpgYGB7cn0KRmVhdHVyZVBsb3QobGFuZ2VyLCBmZWF0dXJlcyA9IGMoIkxtbmEiKSwgY29scyA9IGMoImdyZXkiLCAicmVkIiksIHJlZHVjdGlvbiA9ICJ0c25lIiwgY29tYmluZSA9IEYsIGxhYmVsID0gVCkKVmxuUGxvdChsYW5nZXIsIGZlYXR1cmVzID0gYygiTG1uYSIpLCBzcGxpdC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBwdC5zaXplID0gMCkKVmxuUGxvdChsYW5nZXIsIGZlYXR1cmVzID0gYygiTG1uYSIpLCBzcGxpdC5ieSA9ICJnZW5vdHlwZSIsIHB0LnNpemUgPSAwKQpgYGAKCiMgQ2FsciBleHByZXNzaW9uCgpgYGB7cn0KRmVhdHVyZVBsb3QobGFuZ2VyLCBmZWF0dXJlcyA9IGMoIkNhbHIiKSwgY29scyA9IGMoImdyZXkiLCAicmVkIiksIHJlZHVjdGlvbiA9ICJ0c25lIiwgY29tYmluZSA9IEYsIGxhYmVsID0gVCkKVmxuUGxvdChsYW5nZXIsIGZlYXR1cmVzID0gYygiQ2FsciIpLCBzcGxpdC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBwdC5zaXplID0gMCkKVmxuUGxvdChsYW5nZXIsIGZlYXR1cmVzID0gYygiQ2FsciIpLCBzcGxpdC5ieSA9ICJnZW5vdHlwZSIsIHB0LnNpemUgPSAwKQpgYGAKIyBIc3BhNSBleHByZXNzaW9uCgpgYGB7cn0KRmVhdHVyZVBsb3QobGFuZ2VyLCBmZWF0dXJlcyA9IGMoIkhzcGE1IiksIGNvbHMgPSBjKCJncmV5IiwgInJlZCIpLCByZWR1Y3Rpb24gPSAidHNuZSIsIGNvbWJpbmUgPSBGLCBsYWJlbCA9IFQpClZsblBsb3QobGFuZ2VyLCBmZWF0dXJlcyA9IGMoIkhzcGE1IiksIHNwbGl0LmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIHB0LnNpemUgPSAwKQpWbG5QbG90KGxhbmdlciwgZmVhdHVyZXMgPSBjKCJIc3BhNSIpLCBzcGxpdC5ieSA9ICJnZW5vdHlwZSIsIHB0LnNpemUgPSAwKQpgYGAKIyBJbnMgZXhwcmVzc2lvbgoKYGBge3J9CmZleCA8LSBjKCJJbnMxIiwgIkluczIiLCAiR2NnIiwgIlBweSIsICJTc3QiLCAiUmJwNCIsICJNYWZiIiwgIk1hZmEiLCAiR2hybCIgLCAiWmZwNjA4IiwgIklyeDIiLCAiTnI0YTIiKQpEb3RQbG90KGxhbmdlciwgZmVhdHVyZXMgPSBjKCJHY2ciLCAiSW5zMSIsICJTc3QiLCAiUHB5IiksIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIpCm1hcmtDbHVzdGVyKGZleCkKYGBgCgojIyBQcm9saWZlcmF0aW5nCmBgYHtyfQpmZXggPC0gYygiR21ubiIsICJNa2k2NyIsICJQY25hIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKIyMgRHlpbmcKYGBge3J9CmZleCA8LSBjKCJDYXNwMyIsICJCY2wyIiwgIlBhcnAxIiwgIk5ma2IxIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIEV4b2NyaW5lCmBgYHtyfQpmZXggPC0gYygiQW15MmExIiwgIkNlbGEzYSIsICJDcGExIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKIyMgRW5kb2NyaW5lCmBgYHtyfQpmZXggPC0gYygiQ2hnYSIsICJDaGdiIiwgIlBjc2sxIiwiUGNzazIiLCAiU2NnMiIsICJTY2c1IiwgIk5ldXJvZDEiLCAiSXNsMSIsICJQYXg2IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIEZpYnJvYmxhc3QKYGBge3J9CmZleCA8LSBjKCJDb2wzYTEiLCAiRmJuMSIsICJMdW0iKQptYXJrQ2x1c3RlcihmZXgpCmBgYAoKIyMgU21vb3RoLW11c2NsZSBjZWxscwpgYGB7cn0KZmV4IDwtIGMoIkFjdGEyIiwgIkFjdGcyIiwgIk15aDExIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKU01DIGFuZCBGaWJyb2JsYXN0IHRlbmQgdG8gYmUgaW4gbWl4ZWQgY2x1c3RlcnMgc28gd2UgY2FuIHNlbGVjdCBtb3JlIGFjdXJyYXRlIHRocmVzaG9sZCAKYGBge3J9ClJpZGdlUGxvdChzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTkpLCBmZWF0dXJlcyA9IGMoIkFjdGEyIikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MC41KQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT05KSwgZmVhdHVyZXMgPSBjKCJMdW0iKSkrIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLjM3KQpGZWF0dXJlU2NhdHRlcihzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTkpLCAiQWN0YTIiLCAiTHVtIiwgc3BhbiA9IFQpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MC41KSsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuMzcpClJpZGdlUGxvdChzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTkpLCBmZWF0dXJlcyA9IGMoIkFjdGEyIikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MC43KQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT05KSwgZmVhdHVyZXMgPSBjKCJDb2wzYTEiKSkrIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLjQ1KQpGZWF0dXJlU2NhdHRlcihzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTkpLCAiQWN0YTIiLCAiQ29sM2ExIiwgc3BhbiA9IFQpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MC41KSsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAuNykKYGBgCgojIyBFbmRvdGhlbGlhbCBjZWxscwpgYGB7cn0KZmV4IDwtIGMoIkNkMzQiLCAiUGVjYW0xIiwgIlNlbGUiLCAiU2xjMmExIiwgIlZ3ZiIpCm1hcmtDbHVzdGVyKGZleCkKYGBgCgojIyBMZXVrb2N5dGVzCmBgYHtyfQpmZXggPC0gYygiUHRwcmMiKQptYXJrQ2x1c3RlcihmZXgpCmBgYAoKIyMgQiBjZWxscwpgYGB7cn0KZmV4IDwtIGMoIkNkMTkiLCAiQ3IyIiwgIk1zNGExIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIFQgY2VsbHMKYGBge3J9CmZleCA8LSBjKCJDZDNlIiwgIkNkNCIsICJDZDhhIiwgIkZveHAzIiwgIkwxN2EiLCAiR3ptYiIsICJUb3giLCAiUGRjZDEiLCAiU2xhbWY2IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIFBsYXNtYSBjZWxscwpgYGB7cn0KZmV4IDwtIGMoIlBpbTIiKQptYXJrQ2x1c3RlcihmZXgpCmBgYAoKIyMgRGVuZHJpdGljIGNlbGxzCgpgYGB7cn0KZmV4IDwtIGMoIkd6bWIiLCAiSWwzcmEiKQptYXJrQ2x1c3RlcihmZXgpCmBgYAojIyBTY2h3YW5uIGNlbGxzCmBgYHtyfQpmZXggPC0gYygiTWJwIiwgIk1weiIsICJTMTAwYiIsICJTb3gxMCIpCm1hcmtDbHVzdGVyKGZleCkKYGBgCiMjIE1vbm9jeXRlcwpgYGB7cn0KZmV4IDwtIGMoIkZjZ3I0IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKIyMgTksgY2VsbHMKYGBge3J9CmZleCA8LSBjKCJDZDI3IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKIyMgTWFjcm9waGFnZXMKYGBge3J9CmZleCA8LSBjKCJDY3I1IiwgIkNkNjgiLCAiTWFyY28iLCAiTXJjMSIsICJNc3IxIikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIER1Y3RhbApgYGB7cn0KZmV4IDwtIGMoIktydDE3IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKCiMjIEJldGEgYW5kIGRlbHRhIGNlbGxzCmBgYHtyfQpmZXggPC0gYygiSW5zMSIsICJTc3QiKQptYXJrQ2x1c3RlcihmZXgpCmBgYApXZSBzZWxlY3Qgb3VycyBjbHVzdGVycyB3aXRoIEJldGEgYW5kIERlbHRhIGNlbGxzCmBgYHtyfQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT0yMCksIGZlYXR1cmVzID0gYygiSW5zMSIpKSsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTUuNSkKUmlkZ2VQbG90KHN1YnNldChsYW5nZXIsIHNldXJhdF9jbHVzdGVycz09MjApLCBmZWF0dXJlcyA9IGMoIlNzdCIpKSsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQpCkZlYXR1cmVTY2F0dGVyKHN1YnNldChsYW5nZXIsIHNldXJhdF9jbHVzdGVycz09MjApLCAiSW5zMSIsICJTc3QiLCBzcGFuID0gVCkrIGdlb21fdmxpbmUoeGludGVyY2VwdD01LjUpKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9NCkKYGBgCgojIyBBbHBoYSBhbmQgUFAKYGBge3J9CmZleCA8LSBjKCJHY2ciLCAiUHB5IikKbWFya0NsdXN0ZXIoZmV4KQpgYGAKV2Ugc2VsZWN0IG91ciBjbHVzdGVyIHdpdGggQWxwaGEgYW5kIFBQIGNlbGxzCmBgYHtyfQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT0yMyksIGZlYXR1cmVzID0gYygiR2NnIikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NS41KQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT0yMyksIGZlYXR1cmVzID0gYygiUHB5IikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9Mi41KQpGZWF0dXJlU2NhdHRlcihzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTIzKSwgIkdjZyIsICJQcHkiLCBzcGFuID0gVCkrIGdlb21fdmxpbmUoeGludGVyY2VwdD01LjUpKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9Mi41KQpGZWF0dXJlU2NhdHRlcihzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTIzKSwgIkdjZyIsICJTc3QiLCBzcGFuID0gVCkrIGdlb21fdmxpbmUoeGludGVyY2VwdD01LjUpKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9Mi43KQpgYGAKCiMjQ2xhc2lmaWNhdGlvbgoKIyBJZGVudGlmeSBjZWxsIHR5cGVzCmBgYHtyfQogIGQgPC0gR2V0QXNzYXlEYXRhKGxhbmdlcikKICBtIDwtIG1hdHJpeChkYXRhPWMoIk90aGVyIiksbnJvdz1uY29sKGQpLG5jb2w9MSxieXJvdyA9IEYsZGltbmFtZXMgPSBsaXN0KGNvbG5hbWVzKGQpLGMoImNlbGx0eXBlIikpKQogIHNldENsdXN0ZXJOYW1lIDwtIGZ1bmN0aW9uKHNldXJhdE9iaiwgbW9iaiwgY2x1c3RlcnMsIGNsdXN0ZXJOYW1lKXsKICAgIGluZCA8LSBzZXVyYXRPYmpAbWV0YS5kYXRhW3NldXJhdE9iakBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzICVpbiUgY2x1c3RlcnMsXQogICAgbW9ialtyb3duYW1lcyhpbmQpLCAiY2VsbHR5cGUiXSA8LSBjKGNsdXN0ZXJOYW1lKQogICAgcmV0dXJuKG1vYmopCiAgfQpgYGAKCiMgVW1icmFsZXMgCmBgYHtyfQojIE5LIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSBDZDI3ID4gMC4yICkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIk5LIGNlbGwiCgojIFBsYXNtYSBjZWxscwppbmQgPC0gc3Vic2V0KGxhbmdlciwgc3Vic2V0ID0gUGltMiA+IDAuMiApCm1bcm93bmFtZXMoaW5kQG1ldGEuZGF0YSksICJjZWxsdHlwZSJdIDwtICJQbGFzbWEgY2VsbCIKCiMgTWFjcm9waGFnZXMKaW5kIDwtIHN1YnNldChsYW5nZXIsIHN1YnNldCA9IENkNjggPiAwLjMgIHwgTWFyY28gPiAwLjN8IE1yYzEgPiAwLjMgfCBNc3IxID4gMC4zICkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIk1hY3JvcGhhZ2UiCgojIFNtb290aCBtdXNjbGUgY2VsbHMKaW5kIDwtIHN1YnNldChsYW5nZXIsIHN1YnNldCA9IChBY3RhMiA+IDAuNSAmIEx1bSA+IDAuMzcpIHwgKEFjdGEyID4gMC43ICYgQ29sM2ExID4gMC40NSkpCm1bcm93bmFtZXMoaW5kQG1ldGEuZGF0YSksICJjZWxsdHlwZSJdIDwtICJTTUMiCgojIEZpYnJvYmxhc3RzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoQWN0YTIgPCAwLjUgJiBMdW0gPCAwLjM3KSB8IChBY3RhMiA8IDAuNyAmIENvbDNhMSA8IDAuNDUpKQptW3Jvd25hbWVzKGluZEBtZXRhLmRhdGEpLCAiY2VsbHR5cGUiXSA8LSAiRmlicm9ibGFzdCIKCiMgTGV1a29jeXRlcwppbmQgPC0gc3Vic2V0KGxhbmdlciwgc3Vic2V0ID0gUHRwcmMgPiAxKQptW3Jvd25hbWVzKGluZEBtZXRhLmRhdGEpLCAiY2VsbHR5cGUiXSA8LSAiTGV1a29jeXRlIgoKIyBUIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSBDZDNlID4gMC4zIHwgRm94cDMgPiAwLjMgfCBDZDhhID4gMC4zIHwgQ2Q0ID4gMC4zICkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIlQgY2VsbCIKCiMgQiBjZWxscwppbmQgPC0gc3Vic2V0KGxhbmdlciwgc3Vic2V0ID0gTXM0YTEgPiAwLjMgfCBDZDE5ID4gMC4zKQptW3Jvd25hbWVzKGluZEBtZXRhLmRhdGEpLCAiY2VsbHR5cGUiXSA8LSAiQiBjZWxsIgoKIyBFbmRvdGhlbGlhbCBjZWxscwppbmQgPC0gc3Vic2V0KGxhbmdlciwgc3Vic2V0ID0gQ2QzNCA+IDAuMyB8IFNsYzJhMSA+IDAuMyB8IFBlY2FtMSA+IDAuMykKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIkVuZG90aGVsaWFsIgoKIyBCZXRhIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoSW5zMSA+IDUuNSAmIEdjZyA8IDIgJiBQcHkgPCAyKSkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIkJldGEiCgojIEFscGhhIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoR2NnID4gNS41ICYgUHB5IDwgMi41ICYgSW5zMSA8IDUuNSkpCm1bcm93bmFtZXMoaW5kQG1ldGEuZGF0YSksICJjZWxsdHlwZSJdIDwtICJBbHBoYSIKCiMgRGVsdGEgY2VsbHMKaW5kIDwtIHN1YnNldChsYW5nZXIsIHN1YnNldCA9IChTc3QgPiA0ICYgSW5zMSA8IDUuNSAmIEdjZyA8IDIpKQptW3Jvd25hbWVzKGluZEBtZXRhLmRhdGEpLCAiY2VsbHR5cGUiXSA8LSAiRGVsdGEiCgojIFBQIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoUHB5ID4gMi41ICYgR2NnIDwgNS41ICYgSW5zMSA8IDIpKQptW3Jvd25hbWVzKGluZEBtZXRhLmRhdGEpLCAiY2VsbHR5cGUiXSA8LSAiUFAiCgojIEJEIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoSW5zMSA+IDUuNSAmIFNzdCA+IDQgJiBQcHkgPCAyKSkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIkJEIgogIAojIEFQIGNlbGxzCmluZCA8LSBzdWJzZXQobGFuZ2VyLCBzdWJzZXQgPSAoR2NnID4gNCAmIFBweSA+IDIgJiBJbnMxIDwgMS41ICYgU3N0IDwgMS41KSkKbVtyb3duYW1lcyhpbmRAbWV0YS5kYXRhKSwgImNlbGx0eXBlIl0gPC0gIkFQIgogIApgYGAKCmBgYHtyfQpsYW5nZXIgPC0gQWRkTWV0YURhdGEobGFuZ2VyLCBtLCBjb2wubmFtZSA9ICJjZWxsdHlwZSIpCklkZW50cyhsYW5nZXIpIDwtICdjZWxsdHlwZScKVFNORVBsb3QobGFuZ2VyLCBsYWJlbD1ULCBzcGxpdC5ieSA9ICdnZW5vdHlwZScpCmBgYAoKIyMgU2F2ZSBpc2xldHMgY2VsbHMuCgpgYGB7cn0KbGFuZ2VyJGNlbGx0eXBlIDwtIG1bcm93bmFtZXMobGFuZ2VyQG1ldGEuZGF0YSksICJjZWxsdHlwZSJdCmlzbGV0cyA8LSBzdWJzZXQobGFuZ2VyLCBjZWxsdHlwZT09J0FscGhhJyB8IGNlbGx0eXBlPT0nQmV0YScgfCBjZWxsdHlwZT09J0RlbHRhJyB8IGNlbGx0eXBlPT0iREIiIHwgY2VsbHR5cGU9PSJCRCIgfCBjZWxsdHlwZT09ICJBUCJ8IGNlbGx0eXBlPT0gIlBQIiB8IGNlbGx0eXBlPT0gIlBBIikKc2F2ZVJEUyhpc2xldHMsIGZpbGUgPSAnL2hvbWUvdnFmL3Byb3llY3Rvcy9URkdzL1J1YmVuL05vdGVCb29rcy9pc2xldHMucmRzJykKYGBgCgojIEludGVycHJldGF0ZSBEYXRhCmBgYHtyfQp0YWJsZShsYW5nZXJAbWV0YS5kYXRhJGdlbm90eXBlKQp0Ymxfd3QgPC0gdGFibGUobGFuZ2VyQG1ldGEuZGF0YSRjZWxsdHlwZVtsYW5nZXJAbWV0YS5kYXRhJGdlbm90eXBlID09ICJXVCJdKQpjYmluZCh0Ymxfd3Qscm91bmQocHJvcC50YWJsZSh0Ymxfd3QpKjEwMCwyKSkKdGJsX2tvIDwtIHRhYmxlKGxhbmdlckBtZXRhLmRhdGEkY2VsbHR5cGVbbGFuZ2VyQG1ldGEuZGF0YSRnZW5vdHlwZSA9PSAiS08iXSkKY2JpbmQodGJsX2tvLHJvdW5kKHByb3AudGFibGUodGJsX2tvKSoxMDAsMikpCnRibCA8LSB0YWJsZShpc2xldHNAbWV0YS5kYXRhJGNlbGx0eXBlLCBpc2xldHNAbWV0YS5kYXRhJG9yaWcuaWRlbnQpCmNiaW5kKHRibCxyb3VuZChwcm9wLnRhYmxlKHRibCkqMTAwLDIpKQpgYGAKYGBge3J9ClJpZGdlUGxvdChzdWJzZXQobGFuZ2VyLCBzZXVyYXRfY2x1c3RlcnM9PTIwKSwgZmVhdHVyZXMgPSBjKCJJbnMxIikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NS41KQpSaWRnZVBsb3Qoc3Vic2V0KGxhbmdlciwgc2V1cmF0X2NsdXN0ZXJzPT0yMCksIGZlYXR1cmVzID0gYygiU3N0IikpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NCkKYGBgCgoKYGBge3J9CklubXVubyA8LSBzdWJzZXQobGFuZ2VyLCBjZWxsdHlwZT09ICdNYWNyb3BoYWdlJyB8IGNlbGx0eXBlPT0gJ0xldWtvY3l0ZScgfCBjZWxsdHlwZT09ICdCIGNlbGwnIHwgY2VsbHR5cGU9PSAnVCBjZWxsJ3wgY2VsbHR5cGU9PSAnTksgY2VsbCcpCkRpbVBsb3QoaXNsZXRzLCByZWR1Y3Rpb24gPSAidHNuZSIsIHNwbGl0LmJ5ID0gImdlbm90eXBlIiwgZ3JvdXAuYnkgPSAiY2VsbHR5cGUiLCBsYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAxLjQpICsgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBkZSBjw6lsdWxhcyBpbm11bmVzICh0U05FKSIpCkRpbVBsb3QobGFuZ2VyLCByZWR1Y3Rpb24gPSAidHNuZSIsIGdyb3VwLmJ5ID0gImNlbGx0eXBlIiwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBkZSB0aXBvcyBjZWx1bGFyZXMgKHRTTkUpIikKIyBEaW1QbG90IHPDs2xvIGNvbiBjw6lsdWxhcyBlbmRvY3JpbmFzCnAgPC1EaW1QbG90KGlzbGV0cywgcmVkdWN0aW9uID0gInRzbmUiLCBzcGxpdC5ieSA9ICJnZW5vdHlwZSIsIGdyb3VwLmJ5ID0gImNlbGx0eXBlIiwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS40KSArCiAgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBkZSBjw6lsdWxhcyBlbmRvY3JpbmFzICh0U05FKSIpCnAgKyB4bGltICgyMCwgMzApICsgeWxpbSgxNSwgMzUpCmBgYA==